package iBatis;

import Entidades.*;
import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
import java.io.Reader;
import java.sql.SQLException;
import java.util.List;

/**
 *  LuxarJSP
 *      - Javier Ruiz Hidalgo
 *      - Miguel Alejandro Esteban Ordoñez
 */

/**
 *  Descripción de la Clase:
 *      - Clase que contiene todos los métodos que interactuan con la Base de Datos. Puede
 *        accederse a ellos de forma Estática
 */

public class Persistencia {

    private static final SqlMapClient sqlMap;

    static {
        try {
            String resource = "iBatis/sqlIbatisMapConfig.xml";
            Reader reader = Resources.getResourceAsReader (resource);
            sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException ("Error initializing MyAppSqlConfig"
                    + " class. Cause: " + e);
        }
    }

    //METODOS USUARIO
    public static int existeUsuario(String usuario) throws SQLException{
        return (Integer)sqlMap.queryForObject("countUsuario", usuario);
    }

    public static int compruebaIdentificacion(Usuario usuario) throws SQLException{
        return (Integer)sqlMap.queryForObject("countUsuarioContrasenya", usuario);
    }

    public static List<Usuario> obtieneUsuarios(String usuario) throws SQLException{
        return (List<Usuario>)sqlMap.queryForList("selectUsuarios", usuario);
    }
    
    public static String obtieneAvatar(String usuario) throws SQLException {
        return (String)sqlMap.queryForObject("selectAvatar", usuario);
    }

    public static String obtieneFirma(String usuario) throws SQLException {
        return (String)sqlMap.queryForObject("selectFirma", usuario);
    }

    public static void insertUsuario(Usuario usuario) throws SQLException {
        sqlMap.insert("insertUsuario", usuario);
    }

    public static int obtienePuntos(String usuario) throws SQLException{
        return (Integer) sqlMap.queryForObject("selectPuntosUsuario", usuario);
    }

    public static void actualizaAvatar(Usuario usuario) throws SQLException {
        sqlMap.update("updateAvatar", usuario);
    }

    public static void actualizaFirma(Usuario usuario) throws SQLException {
        sqlMap.update("updateFirma", usuario);
    }

    public static void actualizaPuntos(Usuario usuario) throws SQLException {
        sqlMap.update("updatePuntos", usuario);
    }

    //METODOS TEMA
    public static List<Tema> listarTemas1Jerarquia() throws SQLException{
        return (List<Tema>)sqlMap.queryForList("selectTemas1Jerarquia");
    }

    public static List<Tema> listarSubTemas(int idPadre) throws SQLException{
        return (List<Tema>)sqlMap.queryForList("selectSubTemas", idPadre);
    }
    
    public static int obtieneNumeroSubtemas(int idPadre) throws SQLException{
        return (Integer)sqlMap.queryForObject("countSubtemas", idPadre);
    }

    public static Tema obtieneTema(int id) throws SQLException{
        return (Tema)sqlMap.queryForObject("selectTema", id);
    }

    public static int obtieneMaxIdTemas() throws SQLException{
        return (Integer)sqlMap.queryForObject("selectMaxId");
    }

    public static void insertTema(Tema tema) throws SQLException {
        sqlMap.insert("insertTema", tema);
    }

    //METODOS MENSAJE
    public static Mensaje obtieneUltimoMensajeDeTema(int idTema) throws SQLException{
        return (Mensaje)sqlMap.queryForObject("selectUsuarioFechaUltimoMensaje", idTema);
    }

    public static List<Mensaje> obtieneMensajesDeTema(int idTema) throws SQLException{
        return (List<Mensaje>)sqlMap.queryForList("selectMensajesTema", idTema);
    }

    public static int obtieneNumeroMensajesTema2Jerarquia(int id) throws SQLException{
        return (Integer)sqlMap.queryForObject("countMensajesTema2Jerarquia", id);
    }

    public static int obtieneNumeroMensajesSubTema(int id) throws SQLException{
        return (Integer)sqlMap.queryForObject("countMensajesSubTema", id);
    }

    public static int obtieneNumeroMensajesUsuario(String usuario) throws SQLException{
        return (Integer)sqlMap.queryForObject("countMensajesUsuario", usuario);
    }

    public static void insertMensaje(Mensaje mensaje) throws SQLException {
        sqlMap.insert("insertMensaje", mensaje);
    }

    //METODOS ARTICULOS
    public static List<Articulo> obtieneArticulos()throws SQLException{
        return (List<Articulo>)sqlMap.queryForList("selectArticulos");
    }

    public static int obtienePuntosArticulo(String articulo) throws SQLException{
        return (Integer)sqlMap.queryForObject("selectPuntosArticulo", articulo);
    }

    //METODOS COMPRA
    public static void insertaCompra(Compra compra) throws SQLException {
        sqlMap.insert("insertCompra", compra);
    }

    //METODOS MENSAJEPRIVADO
    public static List<MensajePrivado> obtieneMPrivadosUsuarioDestino(String usuario) throws SQLException{
        return (List<MensajePrivado>)sqlMap.queryForList("selectMensajesUsuarioDestino", usuario);
    }

    public static void insertaMensajePrivado(MensajePrivado mp) throws SQLException {
        sqlMap.insert("insertMensajePrivado", mp);
    }

}
